package com.cyy.common.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cyy.common.constant.Constants;
import com.cyy.common.domain.BaseEntity;
import com.cyy.common.exception.ProcessException;
import com.cyy.common.mapper.TagsMapper;
import com.cyy.common.pojo.dto.CategoryFormDto;
import com.cyy.common.pojo.dto.TagFormDto;
import com.cyy.common.pojo.dto.common.OptionDto;
import com.cyy.common.pojo.entity.Tags;
import com.cyy.common.pojo.query.system.SystemTagQuery;
import com.cyy.common.pojo.vo.api.ApiTagsVo;
import com.cyy.common.pojo.vo.system.SystemTagVo;
import com.cyy.common.service.TagsService;
import com.cyy.common.utils.PageUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * <p>
 * 标签表 服务实现类
 * </p>
 *
 * @author 曹云友
 * @since 2024-04-01
 */
@Service
public class TagsServiceImpl extends ServiceImpl<TagsMapper, Tags> implements TagsService {

    @Override
    public List<ApiTagsVo> queryList() {

        return baseMapper.queryList();
    }

    @Override
    public List<OptionDto<String, Integer>> getOptions() {
        List<Tags> tags = baseMapper.selectList(Wrappers.<Tags>lambdaQuery()
                .select(Tags::getId, Tags::getName)
                .eq(Tags::getStatus, Boolean.TRUE));
        if (CollectionUtil.isEmpty(tags)) {
            throw new ProcessException("未找到对应标签列表信息");
        }
        return tags.stream().map(item -> {
            OptionDto<String, Integer> dto = new OptionDto<>();
            dto.setLabel(item.getName());
            dto.setValue(item.getId());
            return dto;
        }).toList();
    }

    @Override
    public IPage<SystemTagVo> getPage(SystemTagQuery query) {
        return baseMapper.getPage(PageUtils.getPage(), query);
    }

    @Override
    public TagFormDto getTagFormById(Integer id) {
        // 先进行参数判断
        Assert.isFalse(id < 0);
        // 查询是否存在
        Tags tag = Optional.ofNullable(baseMapper.selectById(id))
                .orElseThrow(() -> new ProcessException("未找到具体信息"));

        TagFormDto formDto = new TagFormDto();

        BeanUtils.copyProperties(tag, formDto);

        return formDto;
    }

    @Override
    public void addTag(TagFormDto req) {
        // 参数判断
        Assert.isFalse(StringUtils.isBlank(req.getName()));
        // 查询是否存在
        boolean exists = baseMapper.exists(Wrappers.<Tags>lambdaQuery()
                .eq(Tags::getName, req.getName())
        );
        if (exists) {
            throw new ProcessException("已存在对应标签信息，请修改后重新提交");
        }
        // 创建
        Tags tag = new Tags();
        BeanUtils.copyProperties(req, tag);
        tag.setId(null);

        baseMapper.insert(tag);

    }

    @Override
    public void updateTag(TagFormDto req) {
        // 参数判断
        Assert.isFalse(StringUtils.isBlank(req.getName())
                || Objects.isNull(req.getId())
                || req.getId() < 0);
        // 查询是否有除了当前之外的同名标签
        boolean exists = baseMapper.exists(Wrappers.<Tags>lambdaQuery()
                .eq(Tags::getName, req.getName())
                .ne(BaseEntity::getId, req.getId())
        );
        if (exists) {
            throw new ProcessException("标签命名冲突，请修改后重新确认");
        }

        Tags tag = new Tags();
        BeanUtils.copyProperties(req, tag);

        baseMapper.updateById(tag);
    }

    @Override
    public void deleteTags(String ids) {
        List<String> idList = Arrays.asList(ids.split(Constants.COMMA));

        if (CollectionUtil.isNotEmpty(idList)) {
            baseMapper.update(Wrappers.<Tags>lambdaUpdate()
                    .set(BaseEntity::getStatus, Boolean.FALSE)
                    .in(BaseEntity::getId, idList)
            );
        }
    }
}
